/*
 * Written and copyright 2001-2003 Tobias Minich. Distributed under the GNU
 * General Public License; see the README file. This code comes with NO
 * WARRANTY.
 * 
 * AddFind.java
 * 
 * Created on 23.03.2004
 *
 */
package org.gudy.azureus2.ui.console.commands;

import java.io.File;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.torrent.TOTorrentAnnounceURLGroup;
import org.gudy.azureus2.core3.torrent.TOTorrentAnnounceURLSet;
import org.gudy.azureus2.core3.torrent.TOTorrentCreator;
import org.gudy.azureus2.core3.torrent.TOTorrentFactory;
import org.gudy.azureus2.core3.torrent.TOTorrentProgressListener;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.console.ConsoleInput;

/**
 * @author tobi
 * 
 *         To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code and Comments
 */
public class Create extends IConsoleCommand {

    public Create() {
        super("create");
    }

    public String getCommandDescriptions() {
        return ("create <input file or folder> <output torrent file> <tracker url> [another tracker url]*\t\t\tCreate a torrent file");
    }

    public void printHelpExtra(PrintStream out, List args) {
        out.println("> -----");
        out.println("create <input file or folder> <output torrent file> <tracker url> [another tracker url]*");
        out.println("\tFor example: create /tmp/file.dat /tmp/file.dat.torrent http://tracker.there.com:6969/announce");
        out.println("> -----");
    }

    public void execute(String commandName, final ConsoleInput ci, List<String> args) {
        if (args.size() < 3) {
            printHelp(ci.out, args);
            return;
        }

        File input_file = new File(args.get(0));

        if (!input_file.exists()) {

            ci.out.println("Input file '" + input_file.getAbsolutePath() + "' doesn't exist");

            return;
        }

        File output_file = new File(args.get(1));

        if (output_file.exists()) {

            ci.out.println("Output file '" + input_file.getAbsolutePath() + "' already exists");

            return;
        }

        List<URL> urls = new ArrayList<URL>();

        for (int i = 2; i < args.size(); i++) {

            try {
                urls.add(new URL(args.get(i)));

            } catch (Throwable e) {

                ci.out.println("Invalid URL: " + args.get(i));

                return;
            }
        }

        try {
            TOTorrentCreator creator = TOTorrentFactory.createFromFileOrDirWithComputedPieceLength(input_file, urls.get(0));

            creator.addListener(new TOTorrentProgressListener() {
                public void reportProgress(int percent_complete) {
                    ci.out.println("\t\t" + percent_complete + "%");
                }

                public void reportCurrentTask(String task_description) {
                    ci.out.println("\t" + task_description);
                }
            });

            TOTorrent torrent = creator.create();

            if (urls.size() > 1) {

                TOTorrentAnnounceURLGroup group = torrent.getAnnounceURLGroup();

                TOTorrentAnnounceURLSet[] sets = new TOTorrentAnnounceURLSet[urls.size()];

                for (int i = 0; i < urls.size(); i++) {

                    sets[i] = group.createAnnounceURLSet(new URL[] { urls.get(i) });

                    ci.out.println("\tAdded URL '" + urls.get(i) + "'");
                }

                group.setAnnounceURLSets(sets);
            }

            torrent.serialiseToBEncodedFile(output_file);

            ci.out.println("\tTorrent written to '" + output_file + "'");

        } catch (Throwable e) {

            ci.out.println("Failed to create torrent: " + Debug.getNestedExceptionMessage(e));
        }
    }
}
